/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.flowumi.facade.Impl;


import com.flowumi.entity.Cursos;
import com.flowumi.entity.Cursosestudiantes;
import com.flowumi.entity.CursosestudiantesPK;
import com.flowumi.entity.Roles;
import com.flowumi.entity.Usuarios;
import com.flowumi.entityFacade.CursosFacadeLocal;
import com.flowumi.entityFacade.CursosestudiantesFacadeLocal;
import com.flowumi.entityFacade.RolesFacadeLocal;
import com.flowumi.entityFacade.UsuariosFacadeLocal;
import com.flowumi.exceptions.UsuarioNoCreadoException;
import com.flowumi.facade.AdminFacade;
import com.flowumi.util.EncryptUtil;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author ideacentre
 */
@Stateless
public class AdminFacadeImpl implements AdminFacade {

    @EJB
    RolesFacadeLocal rolesFacadeLocal;
    @EJB
    UsuariosFacadeLocal usuariosFacadeLocal;
    @EJB
    CursosFacadeLocal cursosFacadeLocal;
    @EJB
    CursosestudiantesFacadeLocal cursosestudiantesFacadeLocal;
    
    @Override
    public List<Roles> getListaRolles() {
        return rolesFacadeLocal.findAll();
    }

    @Override
    public void crearUsuario(Usuarios usuario) throws UsuarioNoCreadoException {
        try {
            usuario.setPassword(EncryptUtil.encryptPassword(usuario.getPassword()));
            usuariosFacadeLocal.create(usuario);
        } catch (NoSuchAlgorithmException ex) {
            throw new UsuarioNoCreadoException();
        }
    }

    @Override
    public List<Usuarios> getListaUsuarios() {
        return usuariosFacadeLocal.findAll();
    }

    @Override
    public void AgregarCurso(String nombreCurso, Date fechaInicio, Date fechaFinal, String descripcion, String idProfesor) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Cursos> ObtenerCursos() {
        return cursosFacadeLocal.findAll();
    }

    @Override
    public Cursos getDetalleCurso(long idCurso) {
        return cursosFacadeLocal.find(idCurso);
    }

    @Override
    public Cursos ActualizarCurso(Cursos curso) {
        cursosFacadeLocal.edit(curso);
        return cursosFacadeLocal.find(curso.getIdCurso());
    }

    @Override
    public Cursos AgregarEstudiante(Cursos curso, Usuarios estudiante) {
        Cursosestudiantes cursosestudiantes = new Cursosestudiantes();
        cursosestudiantes.setCursos(curso);
        cursosestudiantes.setUsuarios(estudiante);
        CursosestudiantesPK pk = new CursosestudiantesPK(curso.getIdCurso(), estudiante.getNombreUsuario());
        cursosestudiantes.setCursosestudiantesPK(pk);
        cursosestudiantesFacadeLocal.create(cursosestudiantes);
        curso.getCursosestudiantesList().add(cursosestudiantes);
        estudiante.getCursosestudiantesList().add(cursosestudiantes);
        cursosestudiantes.setCursos(curso);
        cursosestudiantes.setUsuarios(estudiante);
        cursosFacadeLocal.edit(curso);
        usuariosFacadeLocal.edit(estudiante);
        return cursosFacadeLocal.find(curso.getIdCurso());
    }

    @Override
    public Cursos SacarEstudiante(Cursos curso, Usuarios estudiante) {
        CursosestudiantesPK pk = new CursosestudiantesPK(curso.getIdCurso(), estudiante.getNombreUsuario());
        Cursosestudiantes cursosestudiantes = cursosestudiantesFacadeLocal.find(pk);
        curso.getCursosestudiantesList().remove(cursosestudiantes);
        estudiante.getCursosestudiantesList().remove(cursosestudiantes);
        cursosFacadeLocal.edit(curso);
        usuariosFacadeLocal.edit(estudiante);
        cursosestudiantesFacadeLocal.remove(cursosestudiantes);
        return cursosFacadeLocal.find(curso.getIdCurso());
    }

    @Override
    public List<Usuarios> getListaEstudiantesNoCurso(long idCurso) {
        List<Usuarios> estudiantes = usuariosFacadeLocal.getListaEstudiantes(3);
        
        List<Cursosestudiantes> estudiantesCursoList = cursosFacadeLocal.find(idCurso).getCursosestudiantesList();
        List<Usuarios> estudiantesCurso = new ArrayList<Usuarios>(0);
        for(Cursosestudiantes ce : estudiantesCursoList){
            estudiantesCurso.add(ce.getUsuarios());
        }
        List<Usuarios> estudiantesNoCurso = new ArrayList<Usuarios>(0);
        for(Usuarios e : estudiantes){
            if(!estudiantesCurso.contains(e)){
                estudiantesNoCurso.add(e);
            }
        }
        return estudiantesNoCurso;
    }

    @Override
    public void AgregarCurso(Cursos curso) {
        cursosFacadeLocal.create(curso);
    }

    @Override
    public Usuarios getUsuario(String codigo) {
        return usuariosFacadeLocal.find(codigo);
    }

    @Override
    public List<Usuarios> getListaProfesores() {
        return usuariosFacadeLocal.getListaEstudiantes(2);
    }

}
